// 文件路径: dbms/catalogInParse/Column.java
package com.dbms.catalogInParse;

/**
 * 表示数据库表中一个列（Column）的元数据信息。
 *
 * 【已修改】
 * 增加了 `length` 字段，以支持定义变长字符串类型，如 VARCHAR(n)。
 */
public class Column {
    // 列的名称
    private final String name;
    // 列的数据类型 (例如 "INT", "VARCHAR")
    private final String type;
    // 标记该列是否为主键
    private final boolean isPrimaryKey;
    // 新增字段：用于存储类型的长度信息，主要用于VARCHAR(n)中的n
    private final int length;

    /**
     * 旧的构造函数，为了保持向后兼容性。
     * 当类型不需要指定长度时（如INT），调用此构造函数，长度默认为0。
     * @param name 列名
     * @param type 数据类型
     * @param isPrimaryKey 是否为主键
     */
    public Column(String name, String type, boolean isPrimaryKey) {
        // 调用下面的新构造函数，并为length传入默认值0
        this(name, type, isPrimaryKey, 0);
    }

    /**
     * 新增的构造函数，允许指定列类型的长度。
     * 主要用于 VARCHAR(n) 这类需要长度定义的类型。
     * @param name 列名
     * @param type 数据类型
     * @param isPrimaryKey 是否为主键
     * @param length 类型长度
     */
    public Column(String name, String type, boolean isPrimaryKey, int length) {
        this.name = name;
        this.type = type;
        this.isPrimaryKey = isPrimaryKey;
        this.length = length;
    }

    /**
     * 获取列名。
     * @return 列名字符串。
     */
    public String getName() {
        return name;
    }

    /**
     * 获取数据类型。
     * @return 数据类型字符串。
     */
    public String getType() {
        return type;
    }

    /**
     * 检查是否为主键。
     * @return 如果是主键则返回 true，否则返回 false。
     */
    public boolean isPrimaryKey() {
        return isPrimaryKey;
    }

    /**
     * 新增的Getter方法，用于获取类型长度。
     * @return 类型长度。
     */
    public int getLength() {
        return length;
    }

    /**
     * 重写 toString 方法，用于生成该列的字符串表示形式（类似于SQL定义）。
     * @return 格式化的列定义字符串。
     */
    @Override
    public String toString() {
        // 如果类型是VARCHAR且长度大于0，则在类型后附加 "(长度)"
        String lengthStr = (type.equalsIgnoreCase("VARCHAR") && length > 0) ? "(" + length + ")" : "";
        // 拼接完整的列定义，如果它是主键，则附加 "PRIMARY KEY"
        return name + " " + type + lengthStr + (isPrimaryKey ? " PRIMARY KEY" : "");
    }
}